package beans;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * @author Benjamin Gouit
 *
 */
public class Paragraphe {
	
	private String m_filepath, m_xpath, m_titre, m_sousTitre;
	private ArrayList<String> m_termesListe;
	private HashMap<String, Terme> m_termesHashmap;
	private boolean m_isInDescription;
	private int m_id, m_longueur;
	//Poids des termes suivant leur position
	private final int m_modFreqParagraphe = 5, m_modFreqTitre = 3, m_modFreqST = 2, m_modFreqD = 1;
	
	public String getTitre() {
		return m_titre;
	}
	public void setTitre(String titre) {
		this.m_titre = titre;
	}
	public String getSousTitre() {
		return m_sousTitre;
	}
	public void setSousTitre(String sousTitre) {
		this.m_sousTitre = sousTitre;
	}
	public boolean isInDescription() {
		return m_isInDescription;
	}
	public void setInDescription(boolean isInDescription) {
		this.m_isInDescription = isInDescription;
	}
	public void setTexte(String texte) {		
		//Création de la liste des termes non vides du paragraphe
		m_termesListe = splitAndRemoveEmptyWords(texte);
	}
	public ArrayList<String> getListeTermes() {
		return m_termesListe;
	}
	public String getFilepath() {
		return m_filepath;
	}
	public void setFilepath(String filepath) {
		this.m_filepath = filepath;
	}
	public String getXpath() {
		return m_xpath;
	}
	public void setXpath(String xpath) {
		this.m_xpath = xpath;
	}
	public int getId() {
		return m_id;
	}
	public void setId(int id) {
		this.m_id = id;
	}
	public int getLongueur() {
		return m_longueur;
	}

	public HashMap<String, Terme> getTermeMap() {
		return m_termesHashmap;
	}
	
	public void setTermeMap(ArrayList<ArrayList<String>> descriptionsList) {
		// Index de position du terme dans le texte
		int position = 0;
		
		// Création de la hashmap
		m_termesHashmap = new HashMap<String, Terme>();
		
		// Ajout des termes du titre
		if (m_titre != null) {
			ArrayList<String> titreListe = splitAndRemoveEmptyWords(m_titre);
			
			position = addTermesFromListe (m_termesHashmap, titreListe, m_modFreqTitre, position);
		}
		
		// Ajout des termes du sous-titre
		if (m_sousTitre != null) {
			ArrayList<String> sousTitreListe = splitAndRemoveEmptyWords(m_sousTitre);
			
			position = addTermesFromListe (m_termesHashmap, sousTitreListe, m_modFreqST, position);
		}
		
		// Ajout des termes des descriptions
		if (descriptionsList != null) {
			for (ArrayList<String> description : descriptionsList)
				position = addTermesFromListe (m_termesHashmap, description, m_modFreqD, position);
		}
		
		// Ajout des termes du paragraphe
		position = addTermesFromListe (m_termesHashmap, m_termesListe, m_modFreqParagraphe, position);
		
		this.m_longueur = position;
	}
	
	private int addTermesFromListe (HashMap<String, Terme> termesHashMap,
			ArrayList<String> termesListe, int modFreq, int position) {
		for (String s : termesListe) {
			// Si le terme existe déjà, on augmente sa fréquence du poids de la position du terme et rajoute cette nouvelle position
			if (termesHashMap.containsKey(s)) {
				Terme t = termesHashMap.get(s);
				t.setFrequence(t.getFrequence()+modFreq);
				t.setPosition(position);
				position++;
				termesHashMap.remove(s);
				termesHashMap.put(s, t);
			}
			// Sinon on l'ajoute avec les valeurs de base
			else {
				Terme t = new Terme(s, modFreq, position);
				position++;
				termesHashMap.put(s, t);
			}
		}
		
		return position;
	}
	
	private ArrayList<String> splitAndRemoveEmptyWords(String texte) {
		ArrayList<String> liste = new ArrayList<String>();
		
		String[] termeTab = StopList.split(texte);
		liste = new ArrayList<String>();
		for (String s : termeTab) {
			if (!s.isEmpty()) {
				if (!StopList.isEmptyWord(s))
					liste.add(StopList.tronque(s));
			}
		}
		
		return liste;
	}	
	
	@Override
	public String toString() {
		return "Paragraphe [m_filepath=" + m_filepath + ", m_xpath=" + m_xpath
				+ "\n, m_termesListe=" + m_termesListe
				+ "\n, m_titre=" + m_titre
				+ ", m_sousTitre=" + m_sousTitre + ", m_isInDescription="
				+ m_isInDescription + ", m_id=" + m_id + ", m_longueur="
				+ this.getLongueur() + "]";
	}
}
